// 引入swagger-ui文档
const path = require('path');
const fs = require('fs');
const swaggerUi = require('koa2-swagger-ui')
const swagger = require('../utils/swagger')

const koaBody = require('koa-body');
const koaStatic = require('koa-static');

const Jwt = require('koa-jwt');
const Jsonwebtoken = require('jsonwebtoken');

const routing = require('../routes');
const views = require('koa-views');
const VueView = require('koa-vue-view');

const convert = require('koa-convert');
const less = require('koa-less');
// 为浏览器加前缀
var autoprefixer = require('autoprefixer');
var postcss = require('postcss')
// 处理post body 参数
var bodyParser = require('koa-bodyparser');
module.exports = async ({ koa: app }) => {
    app.use(koaBody({
        multipart: true, // 支持文件上传
        // encoding: 'gzip',
        formidable: {
            // uploadDir: 'public/upload/', // 设置文件上传目录
            uploadDir: '/tmp/', // 设置文件上传目录 vercel 部署时，需要设置 tmp 路径
            keepExtensions: true,    // 保持文件的后缀
            maxFieldsSize: 5 * 1024 * 1024, // 文件上传大小
            onFileBegin: (name, file) => { // 文件上传前的设置
                // 无论是多文件还是单文件上传都会重复调用此函数
                // 最终要保存到的文件夹目录
                // const dirName = format(new Date(), "yyyyMMddhhmmss");
                // const dir = path.join(__dirname, `public/upload/${dirName}`);
                // const dir = 'public/upload';
                const dir = '/tmp';
                // 检查文件夹是否存在如果不存在则新建文件夹
                // if (!fs.existsSync(dir)) {
                //     fs.mkdirSync(dir);
                // }
                // 文件名称去掉特殊字符但保留原始文件名称
                const fileName = file.name.replace(" ", "_").replace(/[`~!@#$%^&*()|\-=?;:'",<>\{\}\\\/]/gi, "_");
                file.name = fileName;
                // 覆盖文件存放的完整路径(保留原始名称)
                file.path = `${dir}/${fileName}`;
                console.log(`name: ${name}`);
                // console.log(file, 'file');
            },
            onError: (error) => {
                console.log(error, 'error');
                app.status = 400;
                // 这里可以定义自己的返回内容
                app.body = { code: 400, msg: "上传失败", data: {} };
                return;
            },
        }
    }))
    app.use(bodyParser())
    app.use(swagger.routes(), swagger.allowedMethods())
    app.use(swaggerUi.koaSwagger({
        routePrefix: '/api-docs', // host at /api-docs instead of default /swagger-docs
        swaggerOptions: {
            url: '/swagger.json', // json swagger-jsdoc生成的文档地址
        },
    }))
    // 处理less
    app.use(convert(less(path.join(__dirname, 'less'), {
        dest: path.join(__dirname, 'public'),
        postprocess: {
            css: function (css, req) {
                require('public/less/index.less');
                // 在保存编译的css数据之前的回调函数
                var result = postcss([autoprefixer({ overrideBrowserslist: [">0%"] })]).process(css);

                // 或者直接这样写，将browserslist配置在package.json中
                // var result = postcss([ autoprefixer ]).process(css);
                return result.css
            }
        }
    })))

    // 初始化静态文件目录
    app.use(koaStatic(path.join(__dirname, '..', 'public')));

    app.use(views('./views', {
        map: {
            html: 'underscore'
        }
    }));
    app.use(VueView({
        methodName: 'render',//在koa ctx注册渲染视图的方法名，默认render
        data: {
            // _: require('lodash'),
            app: {
                name: 'BOYCOT_API',
                version: '1.0.0'
            }
        },
        // methods: {
        //     add (a, b) {
        //         return a + b;
        //     }
        // },
        components: {
            ToTop: {
                path: path.join(__dirname, '../views/components/toTop.vue'),
                data () {
                    return {
                    }
                },
                mounted () {
                    window.addEventListener('scroll', this.handleScroll)
                    this.backTop()
                },
                methods: {
                    backTop () {
                        const cubic = value => Math.pow(value, 3)
                        const easeInOutCubic = value => value < 0.5
                        ? cubic(value * 2) / 2
                        : 1 - cubic((1 - value) * 2) / 2
                        const el = document.documentElement
                        const beginTime = Date.now()
                        const beginValue = el.scrollTop
                        const rAF = window.requestAnimationFrame || (func => setTimeout(func, 16))
                        const frameFunc = () => {
                            const progress = (Date.now() - beginTime) / 500
                            if (progress < 1) {
                                el.scrollTop = beginValue * (1 - easeInOutCubic(progress))
                                rAF(frameFunc)
                            } else {
                                el.scrollTop = 0
                            }
                        };
                        rAF(frameFunc)
                    },
                    handleScroll () {
                      if (document.documentElement.scrollTop > 200) {
                        this.isShowTop = true
                      } else {
                        this.isShowTop = false
                      }
                    }
                }
            }
        }
    }));
    routing(app) // 注意动态读取路由放置的位置

    // // 使用jwt
    // app.use(Jwt({ secret: 's' }).unless({
    //     // 过滤不需要验证的路由
    //     path: [
    //         /^\/public\/login/
    //     ]
    // }))

    // 获取token
    app.use(async (ctx, next) => {
        // token解密，获取用户信息
        let token = ctx.headers.authorization
        if (token) {
            let user = Jsonwebtoken.verify(token.split(' ')[1], 's');
        }
        await next()
    })
    // ...More middlewares
    return app;
}